package com.own.demo.lwf.common.time;

import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * @version v1.0
 * @Description:
 * 1.通过Date获取时间
 * 2.Calendar获取时间
 * 3.使用System.currentTimeMillis()获取当前时间
 * 4.使用LocalDateTime获取当前时间。LocalDateTime于Java8后引入，底层final线程安全
 * @Author Administrator
 * @Date 2022/8/14 0014 9:36
 * @copyright 李文峰
 */
public class TimeDemo {

    public static void main(String[] args) {
        // 获取当前时间
        // 1.通过Date获取时间
        Date date = new Date(); // 返回当前时间戳格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss"); // 改变格式
        String date1 = dateFormat.format(date);
        System.out.println("date1 = " + date1);// 获取当前时间

        // 2.Calendar获取时间
        Calendar cal = Calendar.getInstance(); // 返回当前时间戳格式
        SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss"); // 改变格式
        System.out.println(dateFormat1.format(cal.getTime())); // 获取当前时间
        int y = cal.get(Calendar.YEAR); // 获取当前年份
        int m = cal.get(Calendar.MONTH); // 获取当前月份
        int d = cal.get(Calendar.DATE); // 获取当前日期
        int h = cal.get(Calendar.HOUR_OF_DAY); // 获取当前小时
        int mi = cal.get(Calendar.MINUTE); // 获取当前分钟
        int s = cal.get(Calendar.SECOND); // 获取当前秒数
        System.out.println("现在时刻是" + y + "年" + m + "月" + d + "日" + h + "时" + mi + "分" + s + "秒");

        // 3.使用System.currentTimeMillis()获取当前时间
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); // 改变格式
        Date dateNow = new Date(System.currentTimeMillis()); // 返回当前时间戳格式
        System.out.println(formatter.format(dateNow)); // 获取当前时间

        // 4.使用LocalDateTime获取当前时间。LocalDateTime于Java8后引入，底层final线程安全
        LocalDate now1 = LocalDate.now(); // 获取当前年月日（当前日期）
        LocalTime now2 = LocalTime.now();// 获取当前时分秒（具体时间）
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        System.out.println("now1 = " + now1);
        System.out.println("now2 = " + now2);
        System.out.println(localDateTime.getYear());
        System.out.println(localDateTime.getMonth());
        // 获取阿拉伯数字下的月
        System.out.println(localDateTime.getMonthValue());
        // 当月第几天
        System.out.println(localDateTime.getDayOfMonth());
        // 周几
        System.out.println(localDateTime.getDayOfWeek());
        // 当年第几天
        System.out.println(localDateTime.getDayOfYear());


        LocalDateTime now = LocalDateTime.now(); // 当前时间
        LocalDateTime now3 = now.plusYears(5); // 在当前时间加上5年
        LocalDateTime now4 = now.plusMonths(5);// 在当前时间商加上5月
        LocalDateTime now5 = now.plusDays(7); // 在当前时间加上7天
        LocalDateTime now6 = now.plusHours(2); // 在当前时间加上2个小时
        LocalDateTime now7 = now.plusMinutes(30); // 在当前时间加上30分钟
        LocalDateTime now8 = now.plusSeconds(30); // 在当前时间加上30秒
        System.out.println("now3 = " + now3);
        System.out.println("now4 = " + now4);
        System.out.println("now5 = " + now5);
        System.out.println("now6 = " + now6);
        System.out.println("now7 = " + now7);
        System.out.println("now8 = " + now8);


        LocalDateTime now11 = now.minusYears(5); // 在当前时间减上5年
        LocalDateTime now22 = now.minusMonths(5);// 在当前时间商减上5月
        LocalDateTime now33 = now.minusDays(7); // 在当前时间减上7天
        LocalDateTime now44 = now.minusHours(2); // 在当前时间减上2个小时
        LocalDateTime now55 = now.minusMinutes(30); // 在当前时间减上30分钟
        LocalDateTime now66 = now.minusSeconds(30); // 在当前时间减上30秒
        System.out.println("now11 = " + now11);
        System.out.println("now22 = " + now22);
        System.out.println("now33 = " + now33);
        System.out.println("now44 = " + now44);
        System.out.println("now55 = " + now55);


        LocalDateTime now111 = now.withYear(2060); // 改变当前年份（变成2060年）
        LocalDateTime now222 = now.withMonth(12); // 改变当前月份（变成12月份）
        LocalDateTime now333 = now.withDayOfMonth(29); //改变当前天数（变成29日）
        LocalDateTime now444 = now.withHour(23); // 改变当前小时数（变成23时）
        LocalDateTime now555 = now.withMinute(30); // 改变当前分钟（变成30分钟）
        LocalDateTime now666 = now.withSecond(23); // 改变当前小时数（变成23时）
        LocalDateTime now777 = now.withDayOfYear(60); // 从一月一号开始加上60天
        System.out.println("now111 = " + now111);
        System.out.println("now222 = " + now222);
        System.out.println("now333 = " + now333);
        System.out.println("now444 = " + now444);
        System.out.println("now555 = " + now555);
        System.out.println("now666 = " + now666);
        System.out.println("now777 = " + now777);


        //  给LocalDateTime 赋值
        LocalDateTime of = LocalDateTime.of(2022, 2, 5, 1, 1, 1);
        System.out.println(of); // 输出 2022-02-05 01:01:01
        //  给LocalDateTime 赋值 注意（text文本格式要于yyyy-MM-dd HH:mm:ss一致，不然会报错）
        LocalDateTime parse = LocalDateTime.parse("2022-02-05 01:01:01", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println(parse); // 输出 2022-02-05 1:1:1


        // LocalDateTime.parse：字符串转LocalDateTime
        LocalDateTime dateTime = LocalDateTime.parse("2022-08-14 10：01：23", DateTimeFormatter.ofPattern("yyyy-MM-dd HH：mm：ss"));
        System.out.println("dateTime = " + dateTime);

        // 计算时间差
        LocalDateTime now9 = LocalDateTime.now(); // 当前时间
        //  给LocalDateTime 赋值
        LocalDateTime of1 = LocalDateTime.of(2022, 7, 13, 1, 1, 1);
        Duration duration = Duration.between(of1, now9); // 后面减去前面
        long days = duration.toDays(); //相差的天数
        long hours = duration.toHours();//相差的小时数
        long minutes = duration.toMinutes();//相差的分钟数
        long millis = duration.toMillis();//相差毫秒数
        long nanos = duration.toNanos();//相差的纳秒数
        System.out.println(days); // 输出 31
        System.out.println(hours); // 输出 752
        System.out.println(minutes); // 输出 45179
        System.out.println(millis); // 输出 2710769393
        System.out.println(nanos); // 输出 2710863444800000

        // LocalDateTime转字符串
        String sz = DateTimeFormatter.ofPattern("yyyy-MM-dd HH：mm：ss").format(dateTime);
        System.out.println("sz = " + sz);

        // LocalDateTime转Date
        ZoneId zoneId = ZoneId.systemDefault();
        Date datenew = Date.from(localDateTime.atZone(zoneId).toInstant());


        // LocalDateTime转Date
        // LocalDateTime转ZonedDateTime
        ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault());
        System.out.println("zonedDateTime = " + zonedDateTime);
        // ZonedDateTime转Instant
        Instant instant = zonedDateTime.toInstant();
        System.out.println("instant = " + instant);
        // Instant转Date
        Date dateNow1 = Date.from(instant);
        System.out.println("dateNow1 = " + dateNow1);


    }
}

